/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * VentanaVisualizacion.java
 *
 * Created on Apr 26, 2009, 7:01:07 PM
 */
package geomain;

import modelo.grafico.PuntoGrafico;
import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import modelo.Grilla;
import modelo.Punto;
import modelo.SegmentoLinea;
import modelo.grafico.SegmentoLineaGrafico;
import no.geosoft.cc.graphics.GInteraction;
import no.geosoft.cc.graphics.GObject;
import no.geosoft.cc.graphics.GScene;
import no.geosoft.cc.graphics.GSegment;
import no.geosoft.cc.graphics.GStyle;
import no.geosoft.cc.graphics.GText;
import no.geosoft.cc.graphics.GWindow;
import no.geosoft.cc.graphics.GWorldExtent;
import no.geosoft.cc.graphics.ZoomInteraction;

/**
 *
 * @author Fredy
 */
public class VentanaVisualizacion extends javax.swing.JInternalFrame implements GInteraction {

    double extensionDelMundoEnX = 1000;
    double extensionDelMundoEnY = 1000;

    private Main ventanaPadre = null;
    GWindow ventanaDeDibujo = null;
    GScene scene = null;
    GSegment segmentoOrigen = null;
    private Collection puntosSeleccionados;
    private Collection grupoDeLineasSeleccionadas;
    private int mouseX0,  mouseY0;
    private GObject bandaDeSeleccion;

    //private GStyle textStyle_;
    private GStyle estiloPuntoSeleccionado;
    private GStyle estiloPuntoOrigen;
    private GStyle estiloPuntoNormal;
    private GStyle estiloPuntoCandidato;
    private GStyle estiloLineaSeleccionada;
    GSegment puntoInicialDeLinea = null;
    GSegment puntoFinalDeLinea = null;

    /** Creates new form VentanaVisualizacion */
    public VentanaVisualizacion() {
        initComponents();


    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        buttonGroupOpciones = new javax.swing.ButtonGroup();
        jToolBar1 = new javax.swing.JToolBar();
        jToggleButtonZoom = new javax.swing.JToggleButton();
        jToggleButtonOrigen = new javax.swing.JToggleButton();
        jToggleButtonPuntos = new javax.swing.JToggleButton();
        jToggleButtonCrearSegmento = new javax.swing.JToggleButton();
        jToggleButtonSeleccionarSegmentos = new javax.swing.JToggleButton();
        jButton1 = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jLabelG = new javax.swing.JLabel();
        jLabelP = new javax.swing.JLabel();
        jLabelS = new javax.swing.JLabel();
        jLabelO = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jPanelVisualizacion = new javax.swing.JPanel();

        setTitle("Origen, Puntos y Segmentos");
        addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
            public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosing(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameOpened(javax.swing.event.InternalFrameEvent evt) {
                formInternalFrameOpened(evt);
            }
        });

        buttonGroupOpciones.add(jToggleButtonZoom);
        jToggleButtonZoom.setText("Zoom");
        jToggleButtonZoom.setToolTipText("<html>\nBoton Izquierdo = ZOOM IN\n<BR>\nBoton Derecho = ZOOM OUT\n<BR>\nAmbos Botones = RESTAURAR\n</html>");
        jToggleButtonZoom.setFocusable(false);
        jToggleButtonZoom.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jToggleButtonZoom.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToggleButtonZoom.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButtonZoomActionPerformed(evt);
            }
        });
        jToolBar1.add(jToggleButtonZoom);

        buttonGroupOpciones.add(jToggleButtonOrigen);
        jToggleButtonOrigen.setText("Identificar");
        jToggleButtonOrigen.setFocusable(false);
        jToggleButtonOrigen.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jToggleButtonOrigen.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToggleButtonOrigen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButtonOrigenActionPerformed(evt);
            }
        });
        jToolBar1.add(jToggleButtonOrigen);

        buttonGroupOpciones.add(jToggleButtonPuntos);
        jToggleButtonPuntos.setText("Puntos");
        jToggleButtonPuntos.setFocusable(false);
        jToggleButtonPuntos.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jToggleButtonPuntos.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToggleButtonPuntos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButtonPuntosActionPerformed(evt);
            }
        });
        jToolBar1.add(jToggleButtonPuntos);

        buttonGroupOpciones.add(jToggleButtonCrearSegmento);
        jToggleButtonCrearSegmento.setText("Segmento");
        jToggleButtonCrearSegmento.setFocusable(false);
        jToggleButtonCrearSegmento.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jToggleButtonCrearSegmento.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToggleButtonCrearSegmento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButtonCrearSegmentoActionPerformed(evt);
            }
        });
        jToolBar1.add(jToggleButtonCrearSegmento);

        buttonGroupOpciones.add(jToggleButtonSeleccionarSegmentos);
        jToggleButtonSeleccionarSegmentos.setText("Seleccionar Segmentos");
        jToggleButtonSeleccionarSegmentos.setFocusable(false);
        jToggleButtonSeleccionarSegmentos.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jToggleButtonSeleccionarSegmentos.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToggleButtonSeleccionarSegmentos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButtonSeleccionarSegmentosActionPerformed(evt);
            }
        });
        jToolBar1.add(jToggleButtonSeleccionarSegmentos);

        jButton1.setText("Borrar");
        jButton1.setFocusable(false);
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton1);

        getContentPane().add(jToolBar1, java.awt.BorderLayout.PAGE_START);

        jPanel1.setPreferredSize(new java.awt.Dimension(394, 60));
        jPanel1.setLayout(new java.awt.GridBagLayout());

        jLabelG.setText("G = ?");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
        jPanel1.add(jLabelG, gridBagConstraints);

        jLabelP.setText("| P = ?");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
        jPanel1.add(jLabelP, gridBagConstraints);

        jLabelS.setText("| S = ?");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
        jPanel1.add(jLabelS, gridBagConstraints);

        jLabelO.setText("| O = ?");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
        jPanel1.add(jLabelO, gridBagConstraints);

        getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_END);

        jPanelVisualizacion.setLayout(new java.awt.BorderLayout());
        jScrollPane1.setViewportView(jPanelVisualizacion);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-600)/2, (screenSize.height-600)/2, 600, 600);
    }// </editor-fold>//GEN-END:initComponents

    private void formInternalFrameOpened(javax.swing.event.InternalFrameEvent evt) {//GEN-FIRST:event_formInternalFrameOpened
        // TODO add your handling code here:

        if (this.getVentanaPadre() == null) {
            // Una referencia a la ventana Principal de la aplicacion
            this.setVentanaPadre((geomain.Main) this.getParent().getParent().getParent().getParent().getParent());
        }






    }//GEN-LAST:event_formInternalFrameOpened

    private void jToggleButtonZoomActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonZoomActionPerformed
        // TODO add your handling code here:
        ventanaDeDibujo.startInteraction(new ZoomInteraction(scene));
}//GEN-LAST:event_jToggleButtonZoomActionPerformed

    private void jToggleButtonOrigenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonOrigenActionPerformed
        // TODO add your handling code here:
        ventanaDeDibujo.stopInteraction();
        ventanaDeDibujo.startInteraction(this);

}//GEN-LAST:event_jToggleButtonOrigenActionPerformed

    private void jToggleButtonPuntosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonPuntosActionPerformed
        // TODO add your handling code here:
        ventanaDeDibujo.stopInteraction();
        ventanaDeDibujo.startInteraction(this);
}//GEN-LAST:event_jToggleButtonPuntosActionPerformed

    private void jToggleButtonCrearSegmentoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonCrearSegmentoActionPerformed
        // TODO add your handling code here:
        ventanaDeDibujo.stopInteraction();
        ventanaDeDibujo.startInteraction(this);
}//GEN-LAST:event_jToggleButtonCrearSegmentoActionPerformed

    private void jToggleButtonSeleccionarSegmentosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButtonSeleccionarSegmentosActionPerformed
        // TODO add your handling code here:
        ventanaDeDibujo.stopInteraction();
        ventanaDeDibujo.startInteraction(this);
    }//GEN-LAST:event_jToggleButtonSeleccionarSegmentosActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        try {

            /*
            // Undo visual selection of current selection
            if (puntosSeleccionados != null) {
                for (Iterator i = puntosSeleccionados.iterator(); i.hasNext();) {
                    GSegment punto = (GSegment) i.next();
                    if (punto.getOwner() instanceof PuntoGrafico) {
                        PuntoGrafico puntoGraficoSeleccionado = (PuntoGrafico) punto.getOwner();
                        if (!puntoGraficoSeleccionado.isOrigen()) {
                            punto.setStyle(null);
                        }
                    }
                }
            }

            grupoDeLineasSeleccionadas = null;

            puntosSeleccionados = new HashSet();
            ventanaPadre.getEvaluacionDominio().getDominioInicial().setConjuntoP(new HashSet());
             */

            scene.removeAll();

            ventanaPadre.getEvaluacionDominio().getDominioInicial().setConjuntoP(new HashSet());
            ventanaPadre.getEvaluacionDominio().getDominioInicial().setConjuntoS(new HashSet());
            ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().setPuntoOrigen(new Punto(0, 0));
            ventanaPadre.getEvaluacionDominio().getDominioInicial().getConjuntoP().clear();

            ventanaPadre.getEvaluacionDominio().getDominioEvaluado().setConjuntoP(new HashSet());
            ventanaPadre.getEvaluacionDominio().getDominioEvaluado().setConjuntoS(new HashSet());
            ventanaPadre.getEvaluacionDominio().getDominioEvaluado().getGrillaDominio().setPuntoOrigen(new Punto(0, 0));
            
            puntosSeleccionados.clear();

            this.dibujarDominio();
            actualizarEtiquetas();
            scene.refresh();

            buttonGroupOpciones.clearSelection();

        } catch (Exception ex) {
            //
        }
    }//GEN-LAST:event_jButton1ActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup buttonGroupOpciones;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabelG;
    private javax.swing.JLabel jLabelO;
    private javax.swing.JLabel jLabelP;
    private javax.swing.JLabel jLabelS;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanelVisualizacion;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JToggleButton jToggleButtonCrearSegmento;
    private javax.swing.JToggleButton jToggleButtonOrigen;
    private javax.swing.JToggleButton jToggleButtonPuntos;
    private javax.swing.JToggleButton jToggleButtonSeleccionarSegmentos;
    private javax.swing.JToggleButton jToggleButtonZoom;
    private javax.swing.JToolBar jToolBar1;
    // End of variables declaration//GEN-END:variables

    /**
     * @return the ventanaPadre
     */
    public Main getVentanaPadre() {
        return ventanaPadre;
    }

    /**
     * @param ventanaPadre the ventanaPadre to set
     */
    public void setVentanaPadre(Main ventanaPadre) {
        this.ventanaPadre = ventanaPadre;
    }

    synchronized public void dibujarDominio() {

        double extensionDelMundoEnX = 1000;
        double extensionDelMundoEnY = 1000;
        ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().setExtensionX(extensionDelMundoEnX);
        ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().setExtensionY(extensionDelMundoEnY);
        int puntosEnX = ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().getColumnas();
        int puntosEnY = ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().getFilas();
        double espacioEntrePuntosX = extensionDelMundoEnX / puntosEnX;
        double espacioEntrePuntosY = extensionDelMundoEnY / puntosEnY;
        int c = 0;
        int i = 0;
        double acumuladoX = 0;
        double acumuladoY = 0;

        jPanelVisualizacion.removeAll();
        ventanaDeDibujo = new GWindow(new Color(255, 255, 255));
        jPanelVisualizacion.add(ventanaDeDibujo.getCanvas());

        scene = new GScene(ventanaDeDibujo);
        scene.setWorldExtent(0.0, 0.0, extensionDelMundoEnX, extensionDelMundoEnY);

        actualizarEtiquetas();


        for (c = 0; c < puntosEnX + 1; c++) {
            GObject object = new PuntoGrafico(acumuladoX, acumuladoY);
            for (i = 0; i < puntosEnY + 1; i++) {
                object = new PuntoGrafico(acumuladoX, acumuladoY);
                scene.add(object);
                acumuladoY += espacioEntrePuntosY;
            }
            scene.add(object);
            acumuladoX += espacioEntrePuntosX;
            acumuladoY = 0;

        }

        estiloPuntoSeleccionado = new GStyle();
        estiloPuntoSeleccionado.setForegroundColor(new Color(117, 146, 60));
        estiloPuntoSeleccionado.setBackgroundColor(new Color(117, 146, 60));
        estiloPuntoSeleccionado.setLineWidth(2);

        estiloPuntoOrigen = new GStyle();
        estiloPuntoOrigen.setForegroundColor(new Color(255, 102, 0));
        estiloPuntoOrigen.setBackgroundColor(new Color(255, 102, 0));
        estiloPuntoOrigen.setLineWidth(5);

        estiloPuntoNormal = new GStyle();
        estiloPuntoNormal.setForegroundColor(new Color(242, 221, 220));
        estiloPuntoNormal.setBackgroundColor(new Color(242, 221, 220));
        estiloPuntoNormal.setLineWidth(2);

        estiloPuntoCandidato = new GStyle();
        estiloPuntoCandidato.setForegroundColor(new Color(149, 179, 215));
        estiloPuntoCandidato.setBackgroundColor(new Color(149, 179, 215));
        estiloPuntoCandidato.setLineWidth(2);

        estiloLineaSeleccionada = new GStyle();
        estiloLineaSeleccionada.setForegroundColor(new Color(83, 142, 213));
        estiloLineaSeleccionada.setBackgroundColor(new Color(83, 142, 213));
        estiloLineaSeleccionada.setLineWidth(3);

        bandaDeSeleccion = new GObject("Interaction");
        GStyle rubberBandStyle = new GStyle();
        rubberBandStyle.setBackgroundColor(new Color(1.0f, 0.0f, 0.0f, 0.2f));
        bandaDeSeleccion.setStyle(rubberBandStyle);
        scene.add(bandaDeSeleccion);

        jLabelP.setText(" | P = ?");
        jLabelS.setText(" | S = ?");
        jLabelO.setText(" | O = ?");

        setVisible(true);

    /*
    Set<Punto> conjuntoP = ventanaPadre.getMiDominioGeometrico().getConjuntoP();
    //        Set<SegmentoLinea> conjuntoS = ventanaPadre.getMiDominioGeometrico().getConjuntoS();
    for (Iterator it = conjuntoP.iterator(); it.hasNext();) {
    Punto miPunto = (Punto) it.next();
    PuntoGrafico miPuntoGrafico = new PuntoGrafico(miPunto.getCoordenadaX(), miPunto.getCoordenadaY());
    miPuntoGrafico.setStyle(estiloPuntoSeleccionado);
    scene.add(miPuntoGrafico);
    }
     */

    }

    public void event(GScene scene, int event, int x, int y) {

        if (jToggleButtonOrigen.isSelected()) {
            seleccionarOrigen(scene, event, x, y);
        } else if (jToggleButtonPuntos.isSelected()) {
            seleccionarPuntos(scene, event, x, y);
        } else if (jToggleButtonCrearSegmento.isSelected()) {
            crearSegmento(scene, event, x, y);
        } else if (jToggleButtonSeleccionarSegmentos.isSelected()) {
            seleccionarSegmentos(scene, event, x, y);
        } 


    }

    public void seleccionarOrigen(GScene scene, int event, int x, int y) {
        if (event == GWindow.BUTTON1_UP ||
                event == GWindow.BUTTON2_UP) {

            boolean botonIzquierdoArriba = event == GWindow.BUTTON1_UP;
            if (botonIzquierdoArriba) {
                GSegment segmentoSeleccionado = scene.findSegment(x, y);
                if ((segmentoSeleccionado != null) && (segmentoSeleccionado.getOwner() instanceof PuntoGrafico)) {
                    if (segmentoOrigen != null) {
                        if ((puntosSeleccionados != null) && (puntosSeleccionados.contains(segmentoOrigen))) {
                            segmentoOrigen.setStyle(estiloPuntoSeleccionado);
                        } else {
                            segmentoOrigen.setStyle(estiloPuntoNormal);
                        }
                        PuntoGrafico puntoGraficoAnterior = (PuntoGrafico) segmentoOrigen.getOwner();
                        puntoGraficoAnterior.setEsOrigen(false);
                    }
                    segmentoOrigen = segmentoSeleccionado;
                    segmentoOrigen.setStyle(estiloPuntoOrigen);
                    PuntoGrafico puntoGraficoSeleccionado = (PuntoGrafico) segmentoOrigen.getOwner();
                    puntoGraficoSeleccionado.setEsOrigen(true);
                    ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().setPuntoOrigen(puntoGraficoSeleccionado.getPuntoCoordenada());

                    actualizarEtiquetas();
                }
            }
            scene.refresh();
        }
    }

    public void seleccionarPuntos(GScene scene, int event, int x, int y) {


        Set<Punto> setDePuntos = new HashSet<Punto>();
        Collection nuevosPuntosSeleccionados;
        if (puntosSeleccionados == null) {
            puntosSeleccionados = new HashSet();
        }

        switch (event) {
            case GWindow.BUTTON1_DOWN:
                mouseX0 = x;
                mouseY0 = y;
                bandaDeSeleccion.addSegment(new GSegment());
                break;

            case GWindow.BUTTON1_UP:
                bandaDeSeleccion.removeSegments();
                scene.refresh();
                break;

            case GWindow.BUTTON1_DRAG:
                int[] xRubber = new int[]{mouseX0, x, x, mouseX0, mouseX0};
                int[] yRubber = new int[]{mouseY0, mouseY0, y, y, mouseY0};

                GSegment rubberBand = bandaDeSeleccion.getSegment();
                rubberBand.setGeometry(xRubber, yRubber);



                /*
                // Undo visual selection of current selection
                if (grupoDePuntosSeleccionados != null) {
                for (Iterator i = grupoDePuntosSeleccionados.iterator(); i.hasNext();) {
                GSegment punto = (GSegment) i.next();
                if (punto.getOwner() instanceof PuntoGrafico) {
                PuntoGrafico puntoGraficoSeleccionado = (PuntoGrafico) punto.getOwner();
                if (!puntoGraficoSeleccionado.isOrigen()) {
                punto.setStyle(null);
                }
                }
                }
                }
                 */


                //if (typeButton_.getText().equals("inside")) {
                nuevosPuntosSeleccionados = scene.findSegmentsInside(Math.min(mouseX0, x),
                        Math.min(mouseY0, y),
                        Math.max(mouseX0, x),
                        Math.max(mouseY0, y));

                // Remove rubber band from selection
                nuevosPuntosSeleccionados.remove(rubberBand);

                puntosSeleccionados.addAll(nuevosPuntosSeleccionados);

                //setDePuntos.clear();
                //setDePuntos.addAll(ventanaPadre.getEvaluacionDominio().getDominioInicial().getConjuntoP());

                // Set visual appaerance of new selection
                for (Iterator i = puntosSeleccionados.iterator(); i.hasNext();) {
                    GSegment punto = (GSegment) i.next();
                    if (punto.getOwner() instanceof PuntoGrafico) {
                        PuntoGrafico puntoGraficoSeleccionado = (PuntoGrafico) punto.getOwner();
                        if (!puntoGraficoSeleccionado.isOrigen()) {
                            punto.setStyle(estiloPuntoSeleccionado);
                        } else {
                            punto.setStyle(estiloPuntoOrigen);
                        }

                        setDePuntos.add(puntoGraficoSeleccionado.getPuntoCoordenada());
                    }


                }

                ventanaPadre.getEvaluacionDominio().getDominioInicial().getConjuntoP().addAll(setDePuntos);
                actualizarEtiquetas();

                scene.refresh();
                break;
        }

    }

    public void crearSegmento(GScene scene, int event, int x, int y) {


        if (event == GWindow.BUTTON1_UP ||
                event == GWindow.BUTTON2_UP) {

            boolean botonIzquierdoArriba = event == GWindow.BUTTON1_UP;
            if (botonIzquierdoArriba) {
                GSegment segmentoSeleccionado = scene.findSegment(x, y);
                //se valida que tanto el punto inicial como el final de cada segmento
                //de linea pertenezca al conjunto P -> (puntosSeleccionados.contains(segmentoSeleccionado))
                if ((segmentoSeleccionado != null) && (puntosSeleccionados.contains(segmentoSeleccionado)) && (segmentoSeleccionado.getOwner() instanceof PuntoGrafico)) {
                    if (puntoInicialDeLinea != null) {

                        PuntoGrafico puntoGraficoInicial = (PuntoGrafico) puntoInicialDeLinea.getOwner();
                        if ((puntosSeleccionados != null) && (puntosSeleccionados.contains(puntoInicialDeLinea))) {
                            if (puntoGraficoInicial.isOrigen()) {
                                puntoInicialDeLinea.setStyle(estiloPuntoOrigen);
                            } else {
                                puntoInicialDeLinea.setStyle(estiloPuntoSeleccionado);
                            }
                        } else {
                            if (puntoGraficoInicial.isOrigen()) {
                                puntoInicialDeLinea.setStyle(estiloPuntoOrigen);
                            } else {
                                puntoInicialDeLinea.setStyle(estiloPuntoNormal);
                            }
                        }

                        puntoFinalDeLinea = segmentoSeleccionado;
                        PuntoGrafico puntoGraficoFinal = (PuntoGrafico) segmentoSeleccionado.getOwner();

                        Punto puntoInicial = puntoGraficoInicial.getPuntoCoordenada();
                        Punto puntoFinal = puntoGraficoFinal.getPuntoCoordenada();

                        SegmentoLineaGrafico miSegmentoLineaGrafico = new SegmentoLineaGrafico(
                                puntoInicial, puntoFinal);

                        scene.add(miSegmentoLineaGrafico);
                        miSegmentoLineaGrafico.draw();

                        puntoInicialDeLinea = null;

                    } else {
                        puntoInicialDeLinea = segmentoSeleccionado;
                        puntoInicialDeLinea.setStyle(estiloPuntoCandidato);
                        PuntoGrafico puntoGraficoSeleccionado = (PuntoGrafico) puntoInicialDeLinea.getOwner();
                    }

                }
            }
            scene.refresh();

        }


    }

    public void seleccionarSegmentos(GScene scene, int event, int x, int y) {

        Set<SegmentoLinea> setDeLineas = new HashSet<SegmentoLinea>();


        switch (event) {
            case GWindow.BUTTON1_DOWN:
                mouseX0 = x;
                mouseY0 = y;
                bandaDeSeleccion.addSegment(new GSegment());
                break;

            case GWindow.BUTTON1_UP:
                bandaDeSeleccion.removeSegments();
                scene.refresh();
                break;

            case GWindow.BUTTON1_DRAG:
                int[] xRubber = new int[]{mouseX0, x, x, mouseX0, mouseX0};
                int[] yRubber = new int[]{mouseY0, mouseY0, y, y, mouseY0};

                GSegment rubberBand = bandaDeSeleccion.getSegment();
                rubberBand.setGeometry(xRubber, yRubber);



                // Undo visual selection of current selection
                if (grupoDeLineasSeleccionadas != null) {
                    for (Iterator i = grupoDeLineasSeleccionadas.iterator(); i.hasNext();) {
                        GSegment linea = (GSegment) i.next();
                        if (linea.getOwner() instanceof SegmentoLineaGrafico) {
                            SegmentoLineaGrafico segmentoLineaGraficoSeleccionado = (SegmentoLineaGrafico) linea.getOwner();
                            linea.setStyle(null);
                        }
                    }
                }


                //if (typeButton_.getText().equals("inside")) {
                grupoDeLineasSeleccionadas = scene.findSegmentsInside(Math.min(mouseX0, x),
                        Math.min(mouseY0, y),
                        Math.max(mouseX0, x),
                        Math.max(mouseY0, y));

                // Remove rubber band from selection
                grupoDeLineasSeleccionadas.remove(rubberBand);

                setDeLineas.clear();

                // Set visual appaerance of new selection
                for (Iterator i = grupoDeLineasSeleccionadas.iterator(); i.hasNext();) {
                    GSegment linea = (GSegment) i.next();
                    if (linea.getOwner() instanceof SegmentoLineaGrafico) {
                        SegmentoLineaGrafico segmentoLineaGraficoSeleccionado = (SegmentoLineaGrafico) linea.getOwner();
                        linea.setStyle(estiloLineaSeleccionada);

                        setDeLineas.add(segmentoLineaGraficoSeleccionado.getMiSegmentoLinea());
                    }


                }

                ventanaPadre.getEvaluacionDominio().getDominioInicial().setConjuntoS(setDeLineas);
                actualizarEtiquetas();
                scene.refresh();
                break;
        }


    }

    public void actualizarEtiquetas() {
        jLabelG.setText("G = " + ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().getColumnas() + " x " + ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().getFilas());
        jLabelO.setText("| O = " + ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().getPuntoOrigen().getCoordenadaX() + " , " + ventanaPadre.getEvaluacionDominio().getDominioInicial().getGrillaDominio().getPuntoOrigen().getCoordenadaY());
        jLabelP.setText(" | P = " + ventanaPadre.getEvaluacionDominio().getDominioInicial().getConjuntoP().size() + " puntos");
        jLabelS.setText("| S = " + ventanaPadre.getEvaluacionDominio().getDominioInicial().getConjuntoS().size() + " lineas");
    }

    public void preguntarSegmentos(GScene scene, int event, int x, int y) {
        /*

        if (event == GWindow.BUTTON1_UP ||
                event == GWindow.BUTTON2_UP) {


            List segmentos = scene.findSegments(x, y);
            Iterator i = segmentos.iterator();

            double mundoX = 0;
            double mundoY = 0;

            int dispositivoX = 0;
            int dispositivoY = 0;

            Document doc = jEditorPane1.getDocument();
            try {
                doc.insertString(doc.getLength(), x + " , " + y + "\n", null);
                while(i.hasNext()){
                    GSegment actual = (GSegment) i.next();
                    doc.insertString(doc.getLength(), actual.getClass().toString() + "\n", null);

                    mundoX = actual.getOwner().getTransformer().deviceToWorld(x, y)[0];
                    mundoY = actual.getOwner().getTransformer().deviceToWorld(x, y)[1];

                    doc.insertString(doc.getLength(), mundoX + "," + mundoY + "\n", null);

                    dispositivoX = actual.getOwner().getTransformer().worldToDevice(mundoX,mundoY)[0];
                    dispositivoY = actual.getOwner().getTransformer().worldToDevice(mundoX,mundoY)[1];


                    doc.insertString(doc.getLength()
                            , dispositivoX
                            + ","
                            + dispositivoY
                            + "\n"
                            , null);
                }

            } catch (BadLocationException ex) {
                Logger.getLogger(VentanaValidacion.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


         */
    }
}
